package com.orange.mybatisplus;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.orange.mybatisplus.entity.User;
import com.orange.mybatisplus.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Description: user查询操作测试
 */
@SpringBootTest
public class SelectUser {
    @Autowired
    private UserMapper userMapper;

    //根据id查询记录
    @Test
    public void testSelectById() {
        User user = userMapper.selectById(1L);
        System.out.println("user = " + user);
    }

    //通过多个id批量查询
    //完成了动态sql的foreach的功能
    @Test
    public void testSelectBatchIds() {
        List<User> userList = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
        userList.forEach(System.out::println);
    }

    //简单的条件查询
    //通过map封装查询条件
    @Test
    public void testSelectByMap() {
        HashMap<String, Object> hashMap = new HashMap<>();

        //注意：map中的key对应的是数据库中的列名。
        //例如数据库user_id，实体类是userId，这时map的key需要填写user_id
        hashMap.put("name", "lisi");
        hashMap.put("age", 100);

        List<User> userList = userMapper.selectByMap(hashMap);
        userList.forEach(System.out::println);
    }

    //分页查询
    @Test
    public void testSelectPage() {
        //创建Page对象
        //传入两个参数：当前页 和 每页显示记录数
        Page<User> page = new Page<>(2, 3);
        //调用mp分页查询的方法
        //调用mq分页查询过程中，底层封装
        //把分页所有数据封装到page对象里面
        userMapper.selectPage(page, null);

        //通过page对象获取分页数据
        page.getRecords().forEach(System.out::println);
        System.out.println("当前页: " + page.getCurrent());
        System.out.println("每页数据list集合: " + page.getRecords());
        System.out.println("每页显示记录数: " + page.getSize());
        System.out.println("总页数: " + page.getPages());
        System.out.println("总记录数: " + page.getTotal());

        System.out.println("是否有下一页: " + page.hasNext());
        System.out.println("是否有上一页: " + page.hasPrevious());
    }

    //测试selectMapsPage分页：结果集是Map
    @Test
    public void testSelectMapsPage() {
        //创建Page对象
        //传入两个参数：当前页 和 每页显示记录数
        Page page = new Page<>(2, 3);
        //调用mp查询的方法
        IPage<Map<String, Object>> mapsPage = userMapper.selectMapsPage(page, null);

        //注意：此行必须使用 mapIPage 获取记录列表，否则会有数据类型转换错误
        mapsPage.getRecords().forEach(System.out::println);
        System.out.println("当前页: " + page.getCurrent());
        System.out.println("每页数据list集合: " + page.getRecords());
        System.out.println("每页显示记录数: " + page.getSize());
        System.out.println("总页数: " + page.getPages());
        System.out.println("总记录数: " + page.getTotal());

        System.out.println("是否有下一页: " + page.hasNext());
        System.out.println("是否有上一页: " + page.hasPrevious());
    }
}
